package com.pt.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pt.dto.request.TorrentUploadRequest;
import com.pt.entity.Torrent;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 种子服务接口
 */
public interface TorrentService extends IService<Torrent> {
    
    /**
     * 上传种子
     * @param torrent 种子信息
     * @param torrentFile 种子文件输入流
     * @param userId 上传用户ID
     * @return 上传的种子
     */
    Torrent uploadTorrent(Torrent torrent, InputStream torrentFile, Long userId);
    
    /**
     * 获取种子详情
     * @param torrentId 种子ID
     * @return 种子详情
     */
    Torrent getTorrent(Long torrentId);
    
    /**
     * 下载种子文件
     * @param torrentId 种子ID
     * @param passkey 用户密钥
     * @return 种子文件字节数组
     */
    byte[] downloadTorrent(Long torrentId, String passkey);
    
    /**
     * 分页查询种子列表
     * @param category 分类
     * @param keyword 关键词
     * @param promotionOnly 是否只看促销
     * @param page 页码
     * @param size 每页数量
     * @return 种子分页结果
     */
    Page<Torrent> listTorrents(String category, String keyword, Boolean promotionOnly, int page, int size);
    
    /**
     * 获取待审核种子列表
     * @param page 页码
     * @param size 每页数量
     * @return 待审核种子分页结果
     */
    Page<Torrent> getPendingTorrents(int page, int size);
    
    /**
     * 审核通过种子
     * @param torrentId 种子ID
     */
    void approveTorrent(Long torrentId);
    
    /**
     * 审核拒绝种子
     * @param torrentId 种子ID
     * @param reason 拒绝原因
     */
    void rejectTorrent(Long torrentId, String reason);
    
    /**
     * 获取用户上传的种子列表
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页数量
     * @return 用户种子分页结果
     */
    Page<Torrent> getUserTorrents(Long userId, int page, int size);
    
    /**
     * 设置种子促销状态
     * @param torrentId 种子ID
     * @param promotionType 促销类型
     * @param durationHours 促销持续小时数
     */
    void setPromotion(Long torrentId, Integer promotionType, Integer durationHours);
    
    /**
     * 报告客户端状态
     * @param infoHash 种子哈希
     * @param passkey 用户密钥
     * @param uploaded 已上传字节数
     * @param downloaded 已下载字节数
     * @param left 剩余字节数
     * @param event 事件类型
     * @return Tracker响应
     */
    String reportClientStatus(String infoHash, String passkey, Long uploaded, Long downloaded, 
                            Long left, String event);
    
    /**
     * 删除种子
     * @param torrentId 种子ID
     * @param userId 操作用户ID
     */
    void deleteTorrent(Long torrentId, Long userId);
    
    Torrent uploadTorrent(TorrentUploadRequest request, Long uploaderId);
    
    /**
     * 解析上传的种子文件
     * @param file 种子文件
     * @return 种子信息
     */
    Map<String, Object> parseTorrentFile(MultipartFile file);
    
    void updateTorrentStatus(Long torrentId, Integer status);
    
    void updateSeedersAndLeechers(Long torrentId, int seeders, int leechers);
    
    Page<Torrent> searchTorrents(String keyword, Integer categoryId, Integer promotionStatus, int page, int size);
    
    boolean isValidInfoHash(String infoHash);
    
    void incrementDownloadCount(Long torrentId);
    
    /**
     * 获取指定分类的所有种子
     * @param categoryId 分类ID
     * @return 种子列表
     */
    List<Torrent> getTorrentsByCategory(Integer categoryId);
    
    /**
     * 更新种子统计信息
     */
    void updateTorrentStats(Long torrentId);
    
    /**
     * 检查种子是否存在且状态正常
     * @param infoHash 种子info_hash
     * @return 是否存在
     */
    boolean checkTorrentExists(String infoHash);
} 